package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 *
 */
object Spark12_RDD_Operator_DoubeValue {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)
    // 双value类型，需要两个数据源操作，产生关联
    val rdd1 = context.makeRDD(List(1,2,3,4),2)
    val rdd2 = context.makeRDD(List(3,4,5,6),2)

    // 交集
    // 3 4
    val interRdd: RDD[Int] = rdd1.intersection(rdd2)
    // 并集 [1 2 3 4 3 4 5 6]
    val unRdd: RDD[Int] = rdd1.union(rdd2)

    // 差集  站在rdd1的角度，结果是 [1 2]
    val subRdd: RDD[Int] = rdd1.subtract(rdd2)
    // 拉链  谁zip谁，前者就是key，后者就是value，形成元组的集合
    // 使用拉链的时候，必须保证两个rdd的分区，与每个分区的数量一定要一致
    // 不然会报错
    val zipRdd: RDD[(Int, Int)] = rdd1.zip(rdd2)

    /**
      * 除了拉链方法，其它的方法的rdd中的元素类型必须一致
      */
    context.stop()
  }
}
